package ru.ipo.dces.editors.expressolymp;
/**
 * Title:        Фильтр файлов
 * Description:  Фильтр расширений файлов для использования в диалогах выбора файлов
 * Copyright:    Copyright (c) 03.12.2001-02.01.2002
 * @author Jeff Dinkins
 * @version 1.13
 */
import java.io.File;
import java.util.Hashtable;
import java.util.Enumeration;
import javax.swing.filechooser.FileFilter;
/**
 * Компоненент, расширяющий класс FileFilter
 * для использования в диалогах выбора файлов в качестве описателя и фильтра
 * отображаемых имён файлов.
 *
 * В Windows b UNIX расширение в именах файлов обычно идёт после точки (например, ".ext"),
 * Этот компонент позволяет показывать диалогу выбора файлов только те файлы,
 * расширения которых содержатся в этом фильтре.
 *
 * Пример: создание фильтра для файлов с расширениями .gif and .jpg
 *
 *     JFileChooser chooser = new JFileChooser();
 *     ExtFileFilter filter = new ExtFileFilter(
 *                   new String[] {"gif", "png", "jpg", "jpeg"}, "Изображения GIF, PNG, JPEG");
 *     chooser.addChoosableFileFilter(filter);
 *     chooser.showOpenDialog(this);
 */
public class ExtFileFilter extends FileFilter {
   private static String TYPE_UNKNOWN = "Неизвестное расширение";
   private static String HIDDEN_FILE = "Скрытый файл";
   private Hashtable filters = null;
   private String description = null;
   private String fullDescription = null;
   private boolean useExtensionsInDescription = true;
   /**
    * Создание фильтра без определения расширений выбираемых файлов.
    * @see #addExtension
    */
   public ExtFileFilter() {
      super();
      this.filters = new Hashtable();
   }
   /**
    * Создание фильтра файла для выбора файлов по расширению.
    * Пример: new ExtFileFilter("jpg");
    * @see #addExtension
    */
   public ExtFileFilter(String extension) {
      this(extension, null);
   }
   public ExtFileFilter(String extension, String description) {
      this();
      if(extension != null) addExtension(extension);
      if(description != null) setDescription(description);
   }
   /**
    * Создание фильтра для множества файлов с расширениями, заданными массивом строк.
    * Пример: new ExtFileFilter(String[] {"gif", "jpg"});
    * Примечание: "." перед расширением имени файла не требуется и будет игнорироваться.
    * @see #addExtension
    */
   public ExtFileFilter(String[] filters) {
      this(filters, null);
   }
   /**
    * Создание фильтра для множества файлов с расширениями, заданными массивом строк,
    * и общим описанием для этих файлов.
    * Example: new ExtFileFilter(String[] {"gif", "jpg"}, "Gif and JPG Images");
    * Примечание: "." перед расширением имени файла не требуется и будет игнорироваться.
    * @see #addExtension
    */
   public ExtFileFilter(String[] filters, String description) {
      this();
      for (int i = 0; i < filters.length; i++) {
         // add filters one by one
         addExtension(filters[i]);
      }
      if (description != null) setDescription(description);
   }
   /**
    * Возвращает true, если расширение файла, который необходимо вывести в окне диалога,
    * совпадает с назначенным фильтром, иначе возвращает false.
    * Примечание: имена файлов, начинающиеся с ".", игнорируются.
    * @see #getExtension
    * @see FileFilter#accepts
    */
   public boolean accept(File f) {
      if (f != null) {
         if (f.isDirectory()) {
            return true;
         }
         String extension = getExtension(f);
         if (extension != null && filters.get(getExtension(f)) != null) {
            return true;
         };
      }
      return false;
   }
   /**
    * Возвращает расширение из имени файла.
    * @see #getExtension
    * @see FileFilter#accept
    */
   public static String getExtension(File f) {
      if (f != null) {
         String filename = f.getName();
         int i = filename.lastIndexOf('.');
         if ((i > 0) && (i < (filename.length() - 1))) {
            return filename.substring(i+1).toLowerCase();
         };
      }
      return null;
   }
   /**
    * Возвращает описание фильтра.
    * Пример: "Файлы изображений JPEG и GIF (*.jpg, *.gif)"
    * @see setDescription
    * @see setExtensionListInDescription
    * @see isExtensionListInDescription
    * @see FileFilter#getDescription
    */
   public String getDescription() {
      if (fullDescription == null) {
         if (description == null || isExtensionListInDescription()) {
            fullDescription = description==null ? "(" : description + " (";
            //Построение описаний по списку расширений
            Enumeration extensions = filters.keys();
            if (extensions != null) {
               fullDescription += "*." + (String) extensions.nextElement();
               while (extensions.hasMoreElements()) {
                  fullDescription += ", *." + (String) extensions.nextElement();
               }
            }
            fullDescription += ")";
         } else {
            fullDescription = description;
         }
      }
      return fullDescription;
   }
   /**
    * Устанавливает описание фильтра.
    * Пример: filter.setDescription("Файлы изображений Gif and JPG");
    * @see setDescription
    * @see setExtensionListInDescription
    * @see isExtensionListInDescription
    */
   public void setDescription(String description) {
      this.description = description;
      fullDescription = null;
   }
   /**
    * Предопределяет возможность включения расширений файлов (.jpg, .gif, etc)
    * в строку описания.
    * @see getDescription
    * @see setDescription
    * @see isExtensionListInDescription
    */
   public void setExtensionListInDescription(boolean b) {
      useExtensionsInDescription = b;
      fullDescription = null;
   }
   /**
    * Возвращает флаг включения расширений файлов (.jpg, .gif, etc)
    * в строку описания.
    * @see getDescription
    * @see setDescription
    * @see setExtensionListInDescription
    */
   public boolean isExtensionListInDescription() {
      return useExtensionsInDescription;
   }
   /**
    * Добавляет строку расширения имени файла, идущее после ".",
    * к списку расширений фильтра.
    * Пример: после создания фильтра можно добывить
    * в его список поддерживаемых расширений ".jpg" and ".tif":
    *
    *   ExtFileFilter filter = new ExtFileFilter();
    *   filter.addExtension("jpg");
    *   filter.addExtension("tif");
    *
    * Примечание: имена файлов, начинающиеся с ".", игнорируются.
    */
   public void addExtension(String extension) {
      if(filters == null) {
         filters = new Hashtable(5);
      }
      filters.put(extension.toLowerCase(), this);
      fullDescription = null;
   }
}
